package 线程同步.研究所;

/**
 * @Author: FCHL
 * @Description: 线程死锁
 * 死锁原因--> 1：互斥使用；2:不可抢占；3：持有和请求；4：循环等待
 * 解决方法--> 1:加锁顺序;2:加锁时限
 * @Date: 15:19 2021/4/5
 * @Modified By:
 **/
public class DeadLock1 {

    /**
     * 首先我们先定义两个final的对象锁.可以看做是共有的资源.
     */
    final static Object lockA = new Object();
    final static Object lockB = new Object();

    public static void main(String[] args) {
        //生产者A
        new Thread(() -> {
            /**这里一定要让线程睡一会儿来模拟处理数据 ,要不然的话死锁的现象不会那么的明显.这里就是同步语句块里面,
             * 首先获得对象锁lockA,然后执行一些代码,随后我们需要对象锁lockB去执行另外一些代码.
             */
            synchronized (lockA) {
                //这里一个log日志
                System.out.println("ThreadA lock lockA");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (lockB) {
                    //这里一个log日志
                    System.out.println("ThreadA lock lockB");
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                }
            }
        }).start();
        //生产者B
        new Thread(() -> {
            synchronized (lockA) {
                //这里一个log日志
                System.out.println("ThreadB lock lockA");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (lockB) {
                    //这里一个log日志
                    System.out.println("ThreadB lock lockB");
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                }
            }

        }).start();
    }
}